// Symbol
/*
    Symbol表示独一无二，用于解决对象属性名冲突的问题
    不能用new，因为new创建的是对象，而Symbol是基本数据类型
*/

// 1. 基本用法
let myname = Symbol('Katrina');   // 注意这里不要用new 因为Symbol是原始数据类型，不是对象
console.log(myname);   // Symbol(Katrina);
console.log(typeof myname);    // symbol

// 2. 特点
/*
    1.Symbol 函数栈不能用 new 命令，因为 Symbol 是原始数据类型，不是对象
    2.Symbol 表示独一无二的值，因此带有相同参数的两个Symbol 值也不相等
    3.Symbol 不能进行隐式类型转换   [隐式类型转换就是在运算或者判断的时候不能转换]
    4.Symbol 可以显式转为字符串    [显示类型转换就是可以利用String toString]
    5.Symbol 值不能转化为数字
    6.Symbol 值可以转换为布尔值
    7.Symbol 变量不能作为webStorage的键使用
*/


// 3. Symbol应用场景
    // (1)作为对象属性名
    /*
        不能用.运算符，要用方括号
            a. ES5中对象.运算符获取的属性名是字符串，.运算符会将属性名识别为字符串，新建一个属性名给对象，无法和Symbol属性区别
            b. 括号中带双引号的属性名表示字符串属性，不带双引号的属性名表示Symbol属性，以此区别二者
        Symbol 值作为属性名时，该属性是公有属性不是私有属性，可以在类的外部访问
            但是不会出现在 for...in 、 for...of 的循环中，也不会被 Object.keys() 、 Object.getOwnPropertyNames() 返回
            如果要读取到一个对象的 Symbol 属性，可以通过Object.getOwnPropertySymbols() 和 Reflect.ownKeys() 取到
    */
   // (2)定义常量



// 4. Symbol的方法
    // (1)Symbol.for() 用于将描述相同的Symbol变量指向同一个Symbol值
    // (2)Symbol.keyFor() 用来检测该字符串参数作为名称的 Symbol 值是否已被登记，返回一个已登记的 Symbol 类型值的 key
    

// 5. Symbol属性
   // Symbol.prototype.description  用于返回Symbol数据的描述











// BigInt
/*
    1. BigInt 用来描述的是整数
    2. 它填补了 Number 在整数范围上的表示空缺
*/

